# -*- coding: utf-8 -*-
# @Time    : 2024/6/27 17:19
# @Author  : yujiahao
# @File    : 21_pandas_sql.py
# @description:Pandas执行SQL操作


'''使用 SQL 语句能够完成对 table 的增删改查操作，Pandas 同样也可以实现 SQL 语句的基本功能。'''
import pandas as pd

def create_data(file_path):
    # 创建一个字典来存储数据
    data = {
        "address": [
            "北京市东城区南竹竿胡同2号1幢2层30212号银河SOHOC座",
            "北京市东城区东直门内大街277-31号档口",
            "北京市东城区王府井东街8号澳门中心L117商场102室",
            "北京市东城区前门大街108号底商",
            "北京市东城区和平里西街51号雍和宫壹中心A座负一层"
        ],
        "category": [
            "娱乐休闲:咖啡厅",
            "娱乐休闲:咖啡厅",
            "娱乐休闲:咖啡厅",
            "娱乐休闲:咖啡厅",
            "娱乐休闲:咖啡厅"
        ],
        "id": [
            "1874263549184796345",
            "1461638360847848424",
            "1308505235389562852",
            "15442844740539053384",
            "2357391864111641256"
        ],
        "tel": [
            "010-85179080",
            "400-669-2002",
            "400-010-0100",
            "",
            "4000100100"
        ]
    }

    # 将数据转换为 DataFrame
    df = pd.DataFrame(data)

    # 将 DataFrame 写入 Excel 文件
    df.to_excel(file_path, index=False)

    print(f"数据已写入 {file_path}")


# todo 1、 pandas实现select
def pandas_select(df):
    '''
    在 SQL 中，SELECT 查询语句使用,把要查询的每个字段分开，当然您也可以使用*来选择所有的字段。如下所示：
        SELECT address, category, id, tel FROM tips LIMIT 5;
    对于 Pandas 而言，要完成 SELECT 查询，需要把数据集每一列（columns）的名称传递给 DataFrame 对象。如下所示：
        coffee_df[['address','category','id','tel']].head()
    '''

    # 只查看尾3行
    # print(df[['address', 'category', 'id', 'tel']].tail(3))

    # 传入的是一个空列表， 那最终结果将输出所有的行索引标签。
    print(df[[]].tail(3))


# todo 2、pandas实现where

def pandas_where(df):
    '''
    SQL 中的条件查询是通过 WHERE 子句完成的。格式如下所示：
        SELECT * FROM coffee_df WHERE tel = '010-85179080';
    然而 DataFrame 可以通过多种方式实现条件筛选，最直观的方法是通过布尔索引：
        coffee_df[coffee_df['id'] == '1461638360847848424']

    通过布尔运算将 True 或 False 对象传递给 DataFrame 对象，然后返回所有为 True 的行。
    '''

    print(df[df['id'] == 1308505235389562852])


# todo 3、pandas实现groupby

def pandas_groupby(df):
    '''
    在 SQL 语句中，通过 GroupBy 操作可以获取 table 中一组记录的计数。示例如下：
        SELECT id, count(*) FROM tips GROUP BY id;
    而 Pandas 可通过以下代码实现：
        coffe_df.groupby('id').size()

    '''

    print(df.groupby('id').size())


# todo 4、pandas实现limit

def pandas_limit(df):
    '''
    在 SQL 中，LIMIT 语句主要起到限制作用，比如查询前 n 行记录：
        SELECT * FROM coffee_df LIMIT n;

    而在 Pandas 中，您可以通过 head() 来实现（默认前 5 行）
    '''

    print(df[['address', 'tel']].head(3))


def main():
    # 指定文件路径
    file_path = '../../../input/ruyi.xlsx'
    df = pd.read_excel(file_path).head()

    # create_data(file_path)
    # pandas_select(df)
    # pandas_where(df)
    # pandas_groupby(df)
    pandas_limit(df)


if __name__ == '__main__':
    main()
